#include<iostream>
#include<vector>

template<typename T>
void Print(const T&v)
{
    for(auto ite = v.begin();ite != v.end();ite++)
    {
        std::cout<<*ite<<" ";
    }
    std::cout<<std::endl;
}

int main()
{
    // std::vector<int> v; //定义了一个 vector容器   动态数组

    // v.push_back(1); // 尾插法

    // v.pop_back();  // 尾删法

    std::vector<int> v = {1,2,3,4}; //支持直接用 序列初始化
    // for(int i=0;i<v.size();i++)
    // {
    //     std::cout<<v[i]<<" "; //支持中括号直接取出元素，是因为容器里对中括号重载了
    // }
    // std::cout<<std::endl;

    //begin()：容器的头部迭代器，指向容器的第一个元素
    //end():容器的尾部迭代器，指向容器的最后一个元素的下一个
    std::vector<int>::iterator ite_start = v.begin();

    auto ite_end = v.end();
   
   
    Print(v);

    v.insert(v.begin() + 2, 99);

    Print(v);
    
    v.erase(v.begin() + 2);

    Print(v);



    for(auto ite = v.begin();ite != v.end();)
    {
        if(*ite == 99)
        {
            //元素被删除，迭代器会失效
            ite = v.erase(ite);  
            
            //v.erase()的返回值是指向下一个元素的 迭代器 要把它接住
            // 否则会发生问题 
        }
        else
            ite++;
        // 如果删除 ite指向的元素，就得再判断一次 ite指向的位置，因为新的ite是指向原来的下一个位置，
                                                        // 如果不判断直接加，会出现连续相同元素不行的情况
    }




    // std::cout<<*ite_start<<std::endl;

    // for(auto ite = v.begin();ite != v.end();ite++)
    // {
    //     std::cout<<*ite<<" ";
    // }
    
    // std::cout<<std::endl;
    // std::cout<< v.capacity()<<std::endl;
    // std::cout<< v.size()<<std::endl;
    
    v.clear();
    v.at(1); //会抛出越界异常的  跟中括号作用相同
    v.max_size();//理论上vector能存的最大容量

    v.resize(20);//扩容
    std::cout<< v.capacity()<<std::endl;

    v.shrink_to_fit();//把动态数组的容量缩减到 size 大小
    
    return 0;
}